package br.com.esrestaurante.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.esrestaurante.entidades.Abertura;
import br.com.esrestaurante.entidades.Mesa;
import br.com.esrestaurante.util.HibernateUtil;

public class MesaDAO {

	Session session;

	public MesaDAO() {
		this.session = HibernateUtil.getInstance().getSessionFactory()
				.getCurrentSession();
	}

	public void salvar(Mesa mesa) {
		session.save(mesa);
	}

	public void merge(Mesa mesa) {
		session.merge(mesa);
	}

	public void delete(Mesa mesa) {
		session.delete(mesa);
	}

	public Mesa getMesa(Integer idMesa) {
		return (Mesa) session.load(Mesa.class, idMesa);
	}

	public List<Mesa> listarMesas() {
		return session.createCriteria(Mesa.class).list();
	}

	public List<Mesa> listarMesasLivres() {

		List<Mesa> listaMesas = session.createCriteria(Mesa.class).list();
		List<Mesa> listaMesasLivres = new ArrayList<Mesa>();

		for (Mesa mesa : listaMesas) {
			Abertura aberturas = new AberturaDAO().recuperarUltimaAberturasMesa(mesa);
			
			if(aberturas == null || aberturas.getDataFechamento() != null){
				listaMesasLivres.add(mesa);
			}			
		}

		return listaMesasLivres;
	}

	public List<Mesa> listarMesasOcupadas() {

		List<Mesa> listaMesas = session.createCriteria(Mesa.class).list();
		List<Mesa> listaMesasOcupadas = new ArrayList<Mesa>();

		for (Mesa mesa : listaMesas) {
			
			Abertura aberturas = new AberturaDAO().recuperarUltimaAberturasMesa(mesa);
			
			if(aberturas != null && aberturas.getDataFechamento() == null){
				listaMesasOcupadas.add(mesa);
			}
			
		}

		return listaMesasOcupadas;
	}
	/*
	 * public List<Mesa> listarMesaPorAbertura(Abertura abertura) {
	 * 
	 * Criteria criteria = session.createCriteria( Mesa.class );
	 * criteria.add(Restrictions.eq("abertura", abertura));
	 * 
	 * 
	 * return criteria.list();
	 * 
	 * }
	 */
}
